using System;
using System.Collections.Generic;
using System.Text;

namespace DatabaseCode.Data
{
  // Header は C++ コード上はヘッダファイルを指す。

  /*
   * 読み込む文字列の例
   * 
//払出
struct LotNo {
  int code;          // ★ ロットNoコード
  char no[kTextSize];// ロットNo
  int item_code;     // 品名コード ●Item.code

  bool IsEqualKey(const LotNo& r) { return r.code == code; }
};
   */

  class D2_Header
  {
    public D2_Header(string str, string managerName, string dataHeader)
    {
      m_name = managerName;
      m_membername = Utility.SeparateByUndercores(managerName);
      m_dataHeader = dataHeader;
      Parse(str);
    }

    private void Parse(string str)
    {
      m_tables = new List<D3_Table>();
      D3_Table table;
      int len = str.Length;

      for (int i = 0; i < len; i++)
      {
        if (D3_Table.Parse(str, ref i, out table))
        {
          break;
        }
        //テーブルを関連付ける
        if (table != null) m_tables.Add(table);
      }
    }

    //findTable の findMember に参照制約があるテーブルを探す。
    //ここでは複数見つかる可能性があるため、出力用の refs にここで出力する。
    public void FindReference(string findTable, string findMember, ref List<D_Reference> refs, string headerName)
    {
      D_Reference reference = new D_Reference();

      foreach (D3_Table table in m_tables)
      {
        if (table.FindReference(findTable, findMember, out reference.tablename, out reference.membername))
        {
          reference.headername = headerName;
          refs.Add(reference);
          reference = new D_Reference();
        }
      }
    }
    public string IncludeString()
    {
      return "#include \"" + Membername + ".h\"\r\n";
    }
    public string IncludeGuardStartString()
    {
      string macro = "COMMON_" + Utility.UpperSeparateByUndercores(Name) + "_H_\r\n"; // 改行付き
      return "#ifndef " + macro +
        "#define " + macro;
    }
    public string IncludeGuardEndString()
    {
      string macro = "COMMON_" + Utility.UpperSeparateByUndercores(Name) + "_H_\r\n"; // 改行付き
      return "#endif // " + macro;
    }
    private string ToUpperString(string str)
    {
      int len = str.Length;
      string ret = "";
      for (int i = 0; i < len; i++)
      {
        ret += char.ToUpper(str[i]);
      }
      return ret;
    }

    public List<D3_Table> Tables
    {
      get
      {
        return m_tables;
      }
    }
    public string Name
    {
      get
      {
        return m_name;
      }
    }
    public string Membername
    {
      get
      {
        return m_membername;
      }
    }
    public string DataHeader
    {
      get
      {
        return m_dataHeader;
      }
    }

    private List<D3_Table> m_tables;
    private string m_name;       // 例：MonDataMgr
    private string m_membername; // 例：mon_data_mgr
    private string m_dataHeader; // 例：mon_data.h
  }
}
